import { _decorator, Color, Component, Graphics, Node,view ,game, BlockInputEvents, UITransform} from 'cc';
import EventManager from '../../Runtime/EventManger';
import { CONTROLLER_ENUM, EVENT_ENUM } from '../../Enums';
const { ccclass, property } = _decorator;

const SCREEN_WIDTH=view.getVisibleSize().width
const SCREEN_HEIGHT=view.getVisibleSize().height

enum FADE_STATE_ENUM {
  IDLE = 'IDLE',        // 空闲状态
  FADE_IN = 'FADE_IN',  // 淡入状态（从透明到不透明）
  FADE_OUT = 'FADE_OUT' // 淡出状态（从不透明到透明）
}

export const DEFAULT_DURATION = 200  // 默认动画时长0.2秒

@ccclass('DrawrManager')
export class DrawrManager extends Component {
  private ctx: Graphics                    // 图形绘制组件
  private state: FADE_STATE_ENUM = FADE_STATE_ENUM.IDLE  // 当前状态
  private oldTime: number = 0             // 动画开始时间
  private duration: number = 0            // 动画总时长
  private fadeResolve: (value: PromiseLike<null>) => void  // Promise解析函数
  private block:BlockInputEvents

  init() {
    this.block=this.addComponent(BlockInputEvents)
    this.ctx = this.addComponent(Graphics)  // 获取Graphics组件
    const transform=this.getComponent(UITransform)
    transform.setAnchorPoint(0.5,0.5)
    transform.setContentSize(SCREEN_WIDTH,SCREEN_HEIGHT)

    this.setAlpha(1)  // 初始设置为不透明
  }

  setAlpha(percent: number) {
    this.ctx.clear()  // 清除之前绘制的内容
    this.ctx.rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)  // 绘制全屏矩形
    this.ctx.fillColor = new Color(0, 0, 0,255 * percent)  // 设置填充颜色（蓝色，根据透明度调整）
    this.ctx.fill()  // 填充矩形
    this.block.enabled=percent===1
  }

  update() {
    const percent = (game.totalTime - this.oldTime) / this.duration  // 计算动画进度百分比
    // console.log(percent)
    switch(this.state) {
      case FADE_STATE_ENUM.FADE_IN:
        if (percent < 1) {
          this.setAlpha(percent)  // 淡入：逐渐增加透明度
        } else {
          this.setAlpha(1)        // 动画完成，设置为完全不透明
          this.state = FADE_STATE_ENUM.IDLE  // 回到空闲状态
          this.fadeResolve(null)  // 解析Promise
        }
        break;

      case FADE_STATE_ENUM.FADE_OUT:
        if (percent < 1) {
          this.setAlpha(1 - percent)  // 淡出：逐渐减少透明度
        } else {
          this.setAlpha(0)            // 动画完成，设置为完全透明
          this.state = FADE_STATE_ENUM.IDLE  // 回到空闲状态
          this.fadeResolve(null)  // 解析Promise
        }
        break;
      }
  }

  fadeIn(duration: number = DEFAULT_DURATION) {
    this.setAlpha(0)  // 初始状态：完全透明
    this.duration = duration
    this.oldTime = game.totalTime  // 记录开始时间
    this.state = FADE_STATE_ENUM.FADE_IN  // 设置为淡入状态

    return new Promise(resolve => {
      this.fadeResolve = resolve  // 保存resolve函数，在动画完成后调用
    })
  }

  fadeOut(duration: number = DEFAULT_DURATION) {
    this.setAlpha(1)  // 初始状态：完全不透明
    this.duration = duration
    this.oldTime = game.totalTime  // 记录开始时间
    this.state = FADE_STATE_ENUM.FADE_OUT  // 设置为淡出状态

    return new Promise(resolve => {
      this.fadeResolve = resolve  // 保存resolve函数，在动画完成后调用
    })
  }

  mask(){
    this.setAlpha(1)
    return new Promise(resolve => {
      setTimeout(resolve,DEFAULT_DURATION)  // 保存resolve函数，在动画完成后调用
    })
  }
}


